/*
 * msg_def.h
 *
 *  Created on: 2011-7-19
 *      Author: minorityee1984@gmail.com
 *     Purpose: 定義消息頭 消息體
 */

#ifndef MSG_DEF_H_
#define MSG_DEF_H_

#include "type_def.h"

#define GET_ENCODE_METHOD(MSGTYPE) encode_##MSGTYPE
#define GET_DECODE_METHOD(MSGTYPE) decode_##MSGTYPE
#define GET_DUMP_METHOD(MSGTYPE) dump_##MSGTYPE

#define DECLEAR_MSG_ENCODE(MSGTYPE) \
	int GET_ENCODE_METHOD(MSGTYPE)(Byte *pszBuf, unsigned int uBufLen, unsigned int *puOffset, const void *p /*pstMsgBody*/, unsigned int uSize)
#define DECLEAR_MSG_DECODE(MSGTYPE) \
	int GET_DECODE_METHOD(MSGTYPE)(const Byte *pszBuf, unsigned int uBufLen, unsigned int *puOffset, void *p /*pstMsgBody*/, unsigned int uSize)
#define DECLEAR_MSG_DUMP(MSGTYPE) \
	void GET_DUMP_METHOD(MSGTYPE)(char *pszBuf, unsigned int uBufLen, unsigned int *puOffset, const void *p /*pstMsgBody*/)

#define DECLEAR_MSG_CODEENGINE(MSGTYPE) \
	extern DECLEAR_MSG_ENCODE(MSGTYPE); \
	extern DECLEAR_MSG_DECODE(MSGTYPE); \
	extern DECLEAR_MSG_DUMP(MSGTYPE)

#define MSG_DUMP(MSGTYPE, pszBuf, uBufLen, puOffset, p) GET_DUMP_METHOD(MSGTYPE)(pszBUf, uBufLen, puOffset, p)


/////////////////////////////////////////////
//			消息體定義
//	定義步驟：
//	1. 定義消息id宏
//  2. 定義消息體數據結構
//	3. 聲明消息編解碼函數
//  4. 在MsgBody聯合體中添加消息體類型
//  5. 在code_engine.c中實現相關編解碼以及dump信息
/////////////////////////////////////////////

/* ****************************************
 * MSGID: 	MSG_CMD_INIT
 * specify:	初始化
 * ARGS:	fill	填充字節(忽略)
 * ***************************************/
#define MSG_CMD_INIT			0x80

typedef struct tagMsgInit
{
	Byte	fill;
}MsgInit;

DECLEAR_MSG_CODEENGINE(MsgInit);

/* ****************************************
 * MSGID: 	MSG_CMD_ACTIVATE_SCAN
 * specify:	開啟/關閉超聲波掃描
 * ARGS:	turnOn	1表示開啟 0表示關閉
 * ***************************************/
#define MSG_CMD_ACTIVATE_SCAN	0x81

typedef struct tagMsgActivateScan
{
	Byte	turnOn;
}MsgActivateScan;

DECLEAR_MSG_CODEENGINE(MsgActivateScan);

/* ****************************************
 * MSGID: 	MSG_CMD_ACTIVATE_ROTATE
 * specify:	開啟/關閉雲台轉動
 * ARGS:	turnOn	1表示開啟 0表示關閉
 * 			degree	轉動角度(角度表示)負數表示順時針
 * ***************************************/
#define MSG_CMD_ACTIVATE_ROTATE	0xC1

typedef struct tagMsgActivateRotate
{
	Byte		turnOn;
	int16_t		degree;
}MsgActivateRotate;

DECLEAR_MSG_CODEENGINE(MsgActivateRotate);


/////////////////////////////////////////////
//			消息數據結構
/////////////////////////////////////////////

typedef struct tagMsgHeader
{
	uint8_t	msgID;
}MsgHeader;

typedef union tagMsgBody
{
	MsgInit				msgInit;
	MsgActivateScan		msgActivateScan;
	MsgActivateRotate	msgActivateRotate;
}MsgBody;

typedef struct tagMessage
{
	MsgHeader	header;
	MsgBody		body;
}Message;

typedef Message PackageData;

#define GET_MSG_ID(p) (((MsgHeader*)(p))->msgID)

#define PACKED_MSG_HEADER_OFFSET	0
#define PACKED_MSG_HEADER_SIZE		sizeof(uint8_t)
#define PACKED_MSG_BODY_OFFSET		PACKED_MSG_HEADER_SIZE

#define MSG_HEADER_SIZE		(sizeof(MsgHeader))
#define MAX_MSG_BODY_SIZE	(sizeof(MsgBody))
#define MAX_MSG_SIZE	(sizeof(Message))
#define GET_MSG_SIZE(MSGTYPE) (MSG_HEADER_SIZE + sizeof(MSGTYPE))


#endif /* MSG_DEF_H_ */
